#include <iostream>
using namespace std;

// _Z3addii
int add(int a, int b){
    return a+b;
}

// _Z3addRiS_
int add(int& a, int& b){
    return a+b;
}
//
// _Z3addRiS_S_
int add(int& a, int& b, int& c){
    return a+b+c;
}

// _Z3addRii
int add(int& a, int b){
    return a+b;
}

/* 这个函数不能重载，因为函数签名同样是 _Z3addii
long add(int a, int b){
    return a+b;
}*/

// _Z3addiii
int add(int a, int b, int c){
    return a+b+c;
}


// _Z3addPiS_
int add(int* a, int* b){
    return *a + *b;
}

// _ZL3addff
static int add(float a, float b){
    return a+b;
}

auto addf = [](float a, float b){return a+b;};

// _ZN4name3addEii
namespace name{
    int add(int a, int b){
        return a+b;
    }
}

// 函数指针声明
int (*pf) (int* a, int* b);

// 函数指针类型
typedef int (*pftype) (int a, int b);

// 这种格式可读性更好 pftype == pftype2
using pftype2 = int (*) (int, int);

int main(int argc, char *argv[])
{
    pf = add; // pf = _Z3addPiS_
    pftype pf2 = add; // pf2 = _Z3addii
    pftype2 pf3 = add; // pf3 = _Z3addii

    // 重载
    cout << add(1,2) << endl;
    cout << add(1,2,3) << endl;
    cout << name::add(1,2) << endl;
    cout << addf(1.0f, 2.0f) << endl;
    return 0;
}

